home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / tools / utils / twtcp122 / pktdrv / pktdlink / pktqueue.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  2KB  |  90 lines

  1. /********************************************************************/
  2. /*                                                                    */
  3. /*    Packet driver for D-LINK ethernet controller                    */
  4. /*                                                                    */
  5. /*    Copyleft by P. Mayer, 1992 TU-Vienna IAEE                        */
  6. /*    All rights reserved                                                */
  7. /*                                                                    */
  8. /********************************************************************/
  9.  
  10. #include "nicmem.h"
  11. #include "pktqueue.h"
  12. #include <tos.h>
  13.  
  14. #ifndef NULL
  15. #define NULL (void *)0L
  16. #endif
  17.  
  18. #define FALSE 0
  19. #define TRUE  1 
  20.  
  21. #define DEBUGPKT
  22. #define noDEBUG
  23.  
  24. extern long p_disint(void);
  25. extern long p_enabint(void);
  26.  
  27. PKTPOOL *p_init(int npkt,PKTPOOL *p_pool,PKTBUF *p_buf)
  28. {
  29. register int i;
  30.  
  31.     if(!p_pool) return(NULL);
  32.     p_pool->p_get = p_pool->p_put = 0;
  33.     p_pool->p_nbuf = npkt;
  34.     for(i=0; i<npkt; i++)
  35.     {
  36.         p_pool->p_tab[i].p_occupied = FALSE;
  37.         p_pool->p_tab[i].p_pkt = p_buf+i;
  38.     }
  39.     return(p_pool);
  40. }
  41.  
  42. PKTBUF *ap_getpkt(u_short protocol, PKTPOOL *p_pool)
  43. {
  44. PKTBUF *pkt;
  45.     p_disint();
  46.     pkt=p_getpkt(protocol,p_pool);
  47.     p_enabint();
  48.     return(pkt);
  49. }
  50.  
  51. PKTBUF *p_getpkt(u_short protocol, PKTPOOL *p_pool)
  52. {
  53. register int i;
  54.  
  55.     if(!p_pool) return(NULL);
  56.     i = p_pool->p_get;
  57.     if(p_pool->p_tab[i].p_occupied) return(NULL);
  58.     p_pool->p_get++;
  59.     if(p_pool->p_get >= p_pool->p_nbuf) p_pool->p_get = 0;
  60.     p_pool->p_tab[i].p_occupied = protocol;
  61.     return(p_pool->p_tab[i].p_pkt);
  62. }
  63.  
  64. int ap_putpkt(PKTPOOL *p_pool,PKTBUF *pkt)
  65. {
  66. int r;
  67.     p_disint();
  68.     r=p_putpkt(p_pool,pkt);
  69.     p_enabint();
  70.     return(r);
  71. }
  72.  
  73. int p_putpkt(PKTPOOL *p_pool,PKTBUF *pkt)
  74. {
  75. register int i;
  76.  
  77.     if(!p_pool) return(FALSE);
  78.     i = p_pool->p_put;
  79.     if(!p_pool->p_tab[i].p_occupied)
  80.     {
  81.         Cconws("DLINKDRV: Packet already in queue\r");
  82.         return(FALSE);
  83.      }
  84.     p_pool->p_put++;
  85.     if(p_pool->p_put >= p_pool->p_nbuf) p_pool->p_put = 0;
  86.     p_pool->p_tab[i].p_pkt = pkt;
  87.     p_pool->p_tab[i].p_occupied = FALSE;
  88.     return(TRUE);
  89. }
  90.